package serviceImpl;

import Dao.CarDao;
import Dao.RecordDao;
import Dao.UserDao;
import pojo.Car;
import pojo.Record;
import pojo.User;
import service.UserMenu;

import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;

/**
 * 用户菜单类
 * 作用：根据需要调用功能类
 * 注意：用户看不到未上架的车
 *
 */
public class UserMenuImpl implements UserMenu {
    private Scanner sc;
    private UserServiceImpl userImpl;
    private User user;
    int a=0;

    public UserMenuImpl() {
        sc=new Scanner(System.in);
        userImpl=new UserServiceImpl();
    }

    /**
     * 开始选项
     */
    @Override
    public void start() {
        System.out.println("=====================");
        System.out.println("欢迎访问二嗨租车");
        System.out.println("=====================");
        System.out.println("1.登录  2.注册  3.退出");
        int choice=sc.nextInt();
        switch (choice){
            case 1:
                //登录
                sign_in();
                break;
            case 2:
                //注册
                login();
                break;
            case 3:
                //返回选择客户端
                new Choice().choice();
                break;
            default:
                System.out.println("输入错误");
                start();
                break;
        }

    }

    /**
     * 登录
     */
    @Override
    public void sign_in() {
        System.out.println("======登录======>>>>");
        System.out.println("用户名：");
        //输入用户名吗
        String name=sc.next();
        System.out.println("密码：");
        //输入密码
        String password=sc.next();
        //调用功能类中的登录方法 返回登登录的用户
        User user=userImpl.sign_in(name,password);
        if(user==null){
            System.out.println("用户名或密码错误");
            sign_in();
            return;
        }else if (user.isAdmin()){
            System.out.println("请用管理员客户端登录");
            new Choice().choice();
        }else if (!user.isAdmin()){
            menu(user);
        }
    }

    /**
     * 注册
     */
    @Override
    public void login() {
        System.out.println("请输入用户名");
        //新用户的用户名
        String name=sc.next();
        System.out.println("请输入密码");
        //新用户的密码
        String password=sc.next();
        System.out.println("请再次输入密码");
        //重复输入密码 防止密码输入错误
        String password1=sc.next();
        boolean a=true;
        //遍历集合
        for (User user1 : UserDao.getUsers()) {
            //判断输入用户名和用户集合的数据名是否重复
            if (user1.getName().equals(name)){
                a=false;
            }
        }
        //判断两次输入密码是否一样
        if (password.equals(password1)&&a){
            //调用功能类的注册方法
            userImpl.login(name,password);
            //序列化对象
            UserDao.setUsers();
            System.out.println("注册成功");
            start();
        }else{
            System.out.println("注册失败");
            login();
            return;
        }
    }

    /**
     * 主菜单
     * @param user 登录的用户
     */
    @Override
    public void menu(User user) {
        this.user=user;
        System.out.println("==========================");
        System.out.println("欢迎"+user.getName());
        System.out.println("==========================");
        showAllCar(user);
        System.out.println();
        System.out.println("输入0退出");
        System.out.println("输入1+汽车编号 进入租车订单 如1+2");
        System.out.println("输入2+1 按价格降序排序 2+2 按价格升序排序");
        System.out.println("输入3+类型编号 按类型搜索");
        System.out.println("输入4+品牌编号 按品牌搜索");
        System.out.println("输入5  查看全部汽车");
        System.out.println("输入6  查看我的租车记录");
        System.out.println("输入7+汽车编号 还车");
        String choice=sc.next();
        if (choice.length()>2){
            String[] str = choice.split("\\+");
            switch (str[0]){
                case "1":
                    rent(str[1],user );
                    break;
                case "2":
                    sort(str[1],user);
                    break;
                case "3":
                    type(str[1],user);
                    break;
                case "4":
                    brand(str[1],user);
                    break;
                case "7":
                    backCar(str[1],user );
                    break;
                default:
                    System.out.println("输入有误");
                    rest();
                    break;
            }

        }else{
            switch (choice){
                case "0":
                    new Choice().choice();
                    break;
                case "5":
                    showAllCar2(user);
                    break;
                case "6":
                    carRent(user);
                    break;
                default:
                    System.out.println("输入有误");
                    rest();
                    break;
            }
        }


    }

    /**
     * 租车
     * 注意：判断所租车辆是否可租
     */
    @Override
    public void rent(String id, User user) {
        boolean a=true;
        Record record = null;
        //遍历车辆集合
        for (Car car : CarDao.getCars()) {
            //定位所租车辆
            if ((car.getId()+"").equals(id)&&car.isRent()&&car.isStatus()){
                //调用功能类中的租车方法
                record = userImpl.rent(car.getId(),user);
                //序列化对象
                CarDao.setCars();
                RecordDao.setRecords();
                a=false;
            }
        }
        if (a){
            System.out.println("租车失败");
            //租车失败
            rest();
        }else {
            System.out.println("租车成功!租车信息如下：");
            System.out.println("编号\t汽车名称\t每日租金\t备注\t\t品牌\t\t类型\t\t\t借车时间");
            //打印所租车辆
            System.out.println(record.rentShow());
            rest();
        }

    }

    /**
     * 根据菜单选择排序
     * @param choice 决定升序降序  1.降序  2.升序
     * @param user 触发排序功能的用户
     */
    @Override
    public void sort(String choice, User user) {
        //调用功能类的排序方法返回排序后的集合
        ArrayList<Car> cars=userImpl.sort(choice);
        if (cars==null){
            System.out.println("输入错误");
            return;
        }
        //打印排序后集合的信息
        showCar(cars,user);
        rest();
    }
    /**
     * 根据类型查找
     * @param type 查找的类型
     * @param user 触发查找的用户
     */
    @Override
    public void type(String type, User user) {
        System.out.println(type);
        //调用功能类中的按类型查找方法  返回指定类型汽车的集合
        ArrayList<Car> cars=userImpl.type(type);
        if (cars==null){
            System.out.println("没有此类型");
        }
        //打印指定类型车的集合

        showCar(cars,user);
        rest();
    }
    /**
     * 根据品牌查找
     * @param brand 查找的品牌
     * @param user 触发查找的用户
     */
    @Override
    public void brand(String brand, User user) {
        System.out.println(brand);
        //调用功能类中的按品牌查找方法  返回指定品牌汽车的集合
        ArrayList<Car> cars=userImpl.brand(brand);
        if (cars==null){
            System.out.println("没有此品牌");
        }
        //打印指定类型车的集合
        showCar(cars,user);
        rest();
    }

    /**
     * 用于区别打印时用户是否是管理员
     * @param cars  筛选出来车的集合
     * @param user  查询的用户
     */
    public void showCar(ArrayList<Car> cars, User user){
        System.out.println("编号\t汽车名称\t备注\t\t品牌\t\t类型\t\t\t价格\t\t是否可租");
        //遍历集合
        for (Car car : cars) {
            //查看汽车是否上架
            if (car.isStatus()){
                System.out.println(car+"  "+(car.isRent()?"是":"否"));
            }
        }
        rest();
    }

    /**
     * 打印全部的汽车
     * @param user
     */
    @Override
    public void showAllCar(User user) {
        //调用方法打印全部车辆
        //用于菜单前的打印  不需要返回上一层
        userImpl.showAllCar(user);
    }

    /**
     * 菜单中查看全部车的功能
     * @param user 触发用户
     */
    public void showAllCar2(User user){
        //调用方法打印全部车辆
        //用于菜单前的打印  需要返回上一层
        userImpl.showAllCar(user);
        rest();
    }

    @Override
    public void carRent(User user) {
        ArrayList<Record> records = userImpl.carRent();
        boolean a=true;
        //遍历集合
        for (int i=1;i<records.size();i++) {
            //如果此用户存在租车记录
            if (records.get(i).getUser().getName().equals(user.getName())){
                a=false;
            }
        }
        //如果此用户不存在租车记录
        if (a){
            System.out.println("无租车记录");
            rest();
        }else{
            System.out.println("编号\t\t汽车编号\t汽车名称\t\t租金总额\t\t备注\t\t\t品牌\t\t\t类型\t\t\t\t借车时间\t\t\t\t还车时间");
            for (int i=1;i<records.size();i++) {
                //调用方法打印订单
                if (records.get(i).getUser().getName().equals(user.getName())){
                    System.out.println(records.get(i).record());

                }
            }
        }
        System.out.println("输入0   退出");
        System.out.println("输入5   查看全部汽车");
        System.out.println("输入6   查看我的租车记录");
        System.out.println("输入7+汽车编号还车");
        String chioce=sc.next();
        if (chioce.length()<2){

            switch (chioce){
                case "0":
                    menu(user);
                    break;
                case "5":
                    showAllCar2(user);
                    break;
                case "6":
                    carRent(user);
                    break;
                default:
                    System.out.println("输入错误");
                    rest();
                    break;
            }
        }else{
            String[] str = chioce.split("\\+");
            if (str[0].equals("7")){
                backCar(str[1],user);
            }else{
                System.out.println("输入错误");
                carRent(user);
                return;
            }

        }
    }
    /**
     * 判断还车的id是否是自己租的车
     * @param id
     * @param user
     */
    @Override
    public void backCar(String id, User user) {
        //调用方法 确认订单 返回订单
        Record record = userImpl.backCar(Integer.parseInt(id),user);
        //序列化对象
        CarDao.setCars();
        RecordDao.setRecords();
        //如果为空 无订单
        if (record==null){
            System.out.println("您没有租这辆车");
        }else{
            System.out.println("还车成功！还车信息如下：");
            System.out.println("编号\t汽车编号\t每日租金\t总租金\t备注\t\t品牌\t\t类型\t\t\t借车时间\t\t还车时间");
            //获取租车时间点
            Date rentTime = record.getRentTime();
            //获取还车时间点
            Date backTime = record.getBackTime();
            //调用方法获得租车时长
            int day=userImpl.getDay(rentTime,backTime);
            record.setDay(day);
            RecordDao.setRecords();
            //调用对象中固定格式的打印方法
            System.out.println(record.backShow());

        }
        rest();
    }

    /**
     * 返回上一层菜单
     */
    public void rest(){
        System.out.println("输入任意字符返回上一层");
        String str=sc.next();
        menu(user);
    }
}